package cn.stimd.spring.aop.framework;

import java.lang.reflect.Proxy;

/**
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public class DefaultAopProxyFactory implements AopProxyFactory {

    @Override
    public AopProxy createAopProxy(AdvisedSupport config) {
        //如果proxyTargetClass属性为true，需要进一步检查是否能使用Cglib类代理
        if (config.isProxyTargetClass()) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new RuntimeException("TargetClass不存在，创建代理需要一个接口或目标类");
            }

            //如果目标类型是一个接口或Proxy的子类，只能使用JDK动态代理
            if(targetClass.isInterface() || Proxy.isProxyClass(targetClass)){
                return new JdkDynamicAopProxy(config);
            }
            //排除所有不符合的条件，使用Cglib类代理
            else{
                return new ObjenesisCglibAopProxy(config);
            }
        }
        //默认是JDK动态代理
        return new JdkDynamicAopProxy(config);
    }
}
